// JavaScript Document for http://www.miushake.fr

	/* William Jautée 
		http://www.seyartdesign.fr
	*/

// DEBUG :  empèche les console.log de perturber le fonctionnement du site sur les navigateurs ne les supportant pas
if (typeof console == "undefined")
	var console= { log:function() {} };

var URL_SITE = window.location.hostname+'/site';

var SITE_NAME = "miushake";

// Classe Loader ("Chargement...") lors du chargement d'une nouvelle chanson ou autre action ajax nécessitant une attente)
var Loader = new Class({
	initialize:function(){
		this.loaderContainer = $('statutmsg');
		this.makeDisappear();
		this.loaderMsg = this.loaderContainer.getElement('p');
		this.nextVideoEventRemoved = false;
	},
	makeAppear:function(removeNext,msg){ // Param : removeNext => bloque le capteur n'évènement de changement de Vidéos, msg => Message personnalisé
		if (removeNext){
			$$('.next').removeEvent('click',nextVideo);
			$$('.next').set('opacity',0.5);
			this.nextVideoEventRemoved = true;
		}
		this.loaderContainer.setStyle('display','block');
	},
	makeDisappear:function(){
		if (this.nextVideoEventRemoved){
			$$('.next').addEvent('click',nextVideo);
			$$('.next').set('opacity',1);
			this.nextVideoEventRemoved = false;
		}
		this.loaderContainer.setStyle('display','none');
	},
	
});

// Classe EvalMsg ("Vous n'avez pas encore noté ce morceau par ex") en dessous du slider d'évaluation
var EvalMsg = new Class({
	initialize:function(){
		this.msgContainer = $('msgeval');
		this.refreshMsg();
	},
	refreshMsg:function(){
		if (! isConnected()){
			this.msgContainer.set('html',"Connectez vous pour évaluer ce morceau");	
		}
		if (isConnected()){
			if (rating['score'] > -1){
				this.msgContainer.set('html',"Vous avez donné un score de <strong>"+rating['score']+"</strong> à ce morceau");
			}
			else 
				this.msgContainer.set('html',"Vous n'avez pas encore évalué ce morceau");
		}
	},
	setNewScore:function(){
		this.refreshMsg();
		if (this.msgContainer.getElement('strong'))
			this.msgContainer.getElement('strong').tween('color',['#7EB7BF','#919191']);
	}
});

// Point d'entrée
var loadEngine = function(){
	
	// Status Bar ("chargement...")
	loader = new Loader();
	
	// Recherche
	initSearchBar();
	
	document.title = SITE_NAME;
	
	ytplayer = null;
	
	rating = new Array();
	
	nextvidtitle = new Array();
	// Player Container
	loadPlayerContainer();
	
	// Si aucun hash title
	var hash = window.location.hash;
	if (! hash.match(/title*/)){
		nextVideo(); // va éxécuter loadytPlayer(videoID) automatiquement
	}
	
	// History Manager
	HM = new HistoryManager({
		blank_page: URL_SITE+'/helpers/blank.html',
		//delimiter:'!',
 		serializeHash: function (h) {
			//console.log(h);
			//return JSON.encode(h);
 			return Hash.toQueryString(h).cleanQueryString();
 		},
 		deserializeHash: function (s) {
			//console.log("string : "+s);
			//return JSON.decode(decodeURIComponent(s));
			try {
 				return new Hash(s.parseQueryString());
			} catch (e){
				console.log(e);
				HM.set('page',"accueil");
				var tmp = new Element('div',{'html':"<h2>Oups!</h2> <p>La page que vous avez demandé n'existe pas, vous êtes redirigé sur la page d'accueil.</p>"});
				lightbox(tmp,true);
				setTimeout(closeLightbox,2000);
			}
 		} 
	
	});
	
	// les éléments qui requirent d'être authentifié ont comme classe authRequired : A REVOIR ? REVOIR POUR LE SLIDER SI CETTE FACON DE FAIRE CONVIENT
	accessVerification = function(elt){
		if (elt == null || (elt.hasClass('authRequired') && ! isConnected()) ){
			lightbox($('unauthorizedaction'));
			return false;
		} else {
			return true;
		}
	}
	
	// A redéplacer ??:
	addEventPage = function(){
		$$('.navepage').removeEvents('click');
		$$('.navpage').addEvent('click',function(ev){
			ev.stop();
			if (accessVerification(this))
				HM.set('page',this.get('id'));
		});
	}
	addEventPage();
	
	waitingCatRoom = null // variable de salle d'attente pour les catégories (attente de chargement de la page);
	isPageLoading = false; // variable qui passe à true lors du chargement d'une page, puis à false à la fin de celle-ci.
	
	addEventNavCat = function(){
		$$('.navcat').addEvent('click',function(ev){
			ev.stop();
			HM.set('cat',this.get('id'));
		});
	}
	
	// Capteurs d'évenements sur les blocs de contenu paginés
	addEventBlocP = function(){
		$$('.blocP').removeEvents('click');
		$$('.blocP').addEvent('click',function(ev){
			ev.stop();	
			getBlocP(this);
		});
	}

	// fin A redéplacer
	
	HM.addEvent('title:changed',getVideoById);
	HM.addEvent('page:changed',getPage);
	HM.addEvent('cat:changed',function(newCatValue){
		if (isPageLoading || new Hash(HM.getHash().parseQueryString()).get('page') == null){
			waitingCatRoom = newCatValue;
		}
		else
			getCat(newCatValue);	
	});
	
	HM.addEvent('cle:changed',function(newCle){
		if (new Hash(HM.getHash().parseQueryString()).get('page') && new Hash(HM.getHash().parseQueryString()).get('page') == "maRecherche"){
			console.log("new Cle = "+newCle);
			if (! $('principalcontent') || ! $('principalcontent').hasClass('searchResultContainer')){
				window.addEvent('maRecherchePageloaded',function(){
					HM.fireEvent('cle:changed',newCle);	
				});
				return;
			}
			window.removeEvents('maRecherchePageloaded');
			new Request.HTML({
				method:'get',
				url:'index.php?a=rechercher',
				data:'title=1&user=1&yt=1&cle='+newCle,
				update: $('principalcontent'),
				onRequest:function(){
					loader.makeAppear(false);
				},
				onSuccess: function(responseTree,responseElements,responseHTML,responseJavaScript){
					loader.makeDisappear();
					addEventBlocP();
					addEventTitle($('principalcontent'));
					isPlayingTitleLightening();
					$('menu').getElement('form').getElement('input').set('value',decodeURIComponent(newCle));	
				}
			}).send();
		}
	});
	
	HM.addEvent('page:added',function(v){
		if (new Hash(HM.getHash().parseQueryString()).get('user'))
			HM.remove('user');	
	});
	
	HM.addEvent('page:removed',function(v){
		if (new Hash(HM.getHash().parseQueryString()).get('cat'))
			HM.remove('cat');
		if (new Hash(HM.getHash().parseQueryString()).get('cle'))
			HM.remove('cle');	
	});
	
	HM.addEvent('user:changed',function(id_user){
		if (new Hash(HM.getHash().parseQueryString()).get('page')){
			HM.remove('page');	
			$$('.navpage').removeClass('activepage');	
		}
			
		new Request.HTML({
			method:'get',
			url:'index.php?a=getPage&page=voirProfil',
			data:'id_user='+id_user,
			update: $('content'),
			onRequest:function(){
				loader.makeAppear(false);
			},
			onSuccess: function(responseTree,responseElements,responseHTML,responseJavaScript){
				loader.makeDisappear();
				addEventBlocP();
				addEventTitle($('content'));
				isPlayingTitleLightening();
				// Mise à jour des blocs sur le coté
				$$('.sidebloc').each(function(elt){
					if (elt.getElement('.sideblocUpdateContainer')){
						if (elt.hasClass('needAuth')){
							if(isConnected()){
								elt.setStyle('display','block');
							} else {
								elt.setStyle('display','none');
							}
						}
						updateSideBloc(elt);
					}
				});
			}
		}).send();	
	});

	HM.start();
	
	// Si aucun hash page -> page d'accueil
	if (! new Hash(HM.getHash().parseQueryString()).get('page')){
		HM.set('page','accueil');
		setFavicon();
	}
	
	// fonction bug firefow -> replacement du favicon
	function setFavicon() {
  		var link = document.getElement('link[type=image/png]');
		link.clone().replaces(link);
	}
	
		  
	// Chargement du cookie miushake_autoplay
	var cookieAutoPlay = Cookie.read("miushake_autoplay");
	autoplay = (cookieAutoPlay == "false") ? false : true;
	
	// Chargement du cookie miushake_containerevalvisible
	var cookieContainerEvalVisible = Cookie.read("miushake_containerevalvisible");
	containerEvalVisible = (cookieContainerEvalVisible == "false") ? false : true;
	
}

// Initialise player vidéo.
var loadPlayerContainer = function(){

	var recommandContainerControlB = $('recommandpanelbutton');

	var recommandContainer = $('recomcontainer');
	
	slideContainerFx = new Fx.Slide(recommandContainer,{
		transition: 'sine:in:out',
		link:'chain',
		onStart:function(){
			if (slideContainerFx.open)
				recommandContainer.fade('out');
			else
				recommandContainer.fade('in');
		},
		onComplete:function(){
			if (slideContainerFx.open){
				recommandContainerControlB.set('class','in');
				recommandContainer.getParent('div').setStyle('margin','0px');

			}
			else{
				recommandContainerControlB.set('class','out');
				recommandContainer.getParent('div').setStyle('margin','1px 0px 0px 0px');
			}
		}
	});
	//slideContainerFx.show();
	recommandContainerControlB.addEvent('click',function(ev){
		if (ev)
			ev.stop();
		slideContainerFx.toggle();
	});
	
};

var loadytPlayer = function(videoID){
    var params = { allowScriptAccess: "always", wmode: "transparent",allowFullScreen:"false" };
    var atts = { id: "myytplayer" }; // l'élément id="ytapiplayer" va etre remplacé par un élément object d'id myytplayer
    swfobject.embedSWF("http://www.youtube.com/e/"+videoID+"?enablejsapi=1&fs=0&rel=0&playerapiid=42",
    "ytapiplayer", "309", "230", "8", null, null, params, atts);
	console.log("loadytPlayer");
}

// appelé par l'api youtube une fois le lecteur près :
var onYouTubePlayerReady = function(playerId) {
      ytplayer = $('myytplayer');
	  ytplayerState=null;
	  console.log("onYouTubePlayerReady");
	  // Referme le slideContainer une fois la vidéo chargé si pas page Shake It et option int. eval tjs visible à false
	  if (!containerEvalVisible && slideContainerFx.open && new Hash(HM.getHash().parseQueryString()).get('page') && new Hash(HM.getHash().parseQueryString()).get('page')!="shakeIt"){
			slideContainerFx.slideOut();
	  }    
	  errorOnVideo=false;
	  initminiplayer();
	  recommandationUiInit();
	  interval=-1;
	  //ytplayer.playVideo(); // lancement de la vidéo
	  //changeVideo(nextvidtitle);
	  
	  // Changement des infos liées à la vidéo.
	  loadTitleInfos();
	  
	  // Première lecture pour voir si pb sur la vidéo (vidéo supprimée par ex)
	  ytplayer.playVideo();
	  ytplayer.pauseVideo();
	  hasToPause = true; // variable pour test car on doit faire pause sur la prochaine vidéo chargé (dans onytplayerStateChange) en cas d'erreur sur la précédente initialement chargée. variable mis à false lors d'un "nextVideo()" voulu par l'utilisateur.
		
	  ytplayer.addEventListener("onStateChange", "onytplayerStateChange");
	  ytplayer.addEventListener("onError","onytError");
}

// appelé lors d'un changement sur le player :
var onytplayerStateChange= function(newState) {
   console.log("Player's new state: " + newState);
   ytplayerState=newState;
   clearInterval(interval);
   switch (ytplayerState){
	   //lecture
	  	case 1:
			$('playpausebutton').set('class','pause');
			interval = setInterval(setAvanceBar,2000);
		break;
		// pause
		case 2:
			$('playpausebutton').set('class','play');
		break;
		// fin
		case 0:
			$('playpausebutton').set('class','play');
			if (autoplay && nextvidtitle['method_recommendation'] != 2){
				nextVideo();
				hasToPause = false;
			}
		break;
		// non commencé
		case -1:
			errorOnVideo = false;
		break;
		// buffering
		case 3:
			if (!autoplay || hasToPause || nextvidtitle['method_recommendation'] == 2)
				ytplayer.pauseVideo();
		break;
		
		default:
		break;
	}
	setAvanceBar();  
}

// Si erreur (capteur d'évenement "onError" de la fonction onYouTubePlayerReady)
var onytError = function(errorCode){
	errorOnVideo = true;	 
	switch (errorCode){
		case 2:
			console.log("Paramètre de requête vidéo invalide");
		break;
		case 100:
			console.log("Vidéo non trouvé ou privé");
		break;
		case 150:
		case 101:
			console.log("Mode embarqué non autorisé sur cette vidéo");
		break;	
		default:
		break;
	}
	// Si connecté, la vidéo a déja été noté -1, passage de la note à -2 pour signifier une erreur et non un zappage volontaire
	if (isConnected()){
		updateRating(-2);	
	}
	nextVideo(); // on zappe
	
	if (nextvidtitle['method_recommendation'] == 2) // si erreur lors de choix de l'utilsiateur, pause sur la vidéo
		hasToPause=true;
}

// Initialisation du mini player depuis loadPlayerContainer()
var initminiplayer = function(){
	$('playpausebutton').addEvent('click',function(ev){
		ev.stop();
		if (ytplayerState!=1 && ytplayerState!=-1 ){
			ytplayer.playVideo();
		}
		else
			ytplayer.pauseVideo();
	});
	
	$('barcontainer').addEvent('click',function(evt){
		var mouseX = evt.page.x - this.getPosition().x;
		ytplayer.seekTo(mouseX/($('durationbar').getStyle('width').toInt())*ytplayer.getDuration(),true);
		//setAvanceBar(); -> mis dans onytplayerStateChange
	});
	
	// Capteur d'évènement Next Video
	$$('.next').addEvent('click',nextVideo);
	
}


// bar d'avancement du mini player : appelé par un setInterval et lors d'un clic sur la bar d'avancement
var setAvanceBar = function(){
	//console.log("changementbar");
	var ratio = ytplayer.getCurrentTime()/ytplayer.getDuration();
	$('currentduration').setStyle('width',(ratio*$('durationbar').getStyle('width').toInt())+'px');	
	
}

// Requete Ajax pour avoir la nouvelle vidéo selon la recommendation, appellé par l'évenement clic sur "suivant" et à la fin d'une vidéo.
var nextVideo = function(evt){
	if (evt){
		evt.stop();
		if (hasToPause)
			hasToPause = false;	// remise à l'état false de la variable hasToPause (on sort du cas de la 1ere vidéo chargée lors du chargement du site
	}
	nextvidtitle = new Array();
	var req = new Request({
		method:'get',
		url:'index.php',
		data:'a=next',
		onRequest:function(){ 
			loader.makeAppear(true) //Affichage de la barre de chargement
		},
		onSuccess:function(responseText, responseXML){
			processRequest(responseXML);
		}
	});
	req.send();
}

// Lit une vidéo depuis un id youtube (page recherche)
var getVideoFromYT = function(eltTitleL_yt){
	nextvidtitle = new Array();	
	nextvidtitle['id_title'] = -1;
	nextvidtitle['youtube_id'] = eltTitleL_yt.getElement('input.yt_youtube_id').get('value');
	nextvidtitle['name'] = Encoder.htmlDecode(eltTitleL_yt.getElement('input.yt_title').get('value'));
	nextvidtitle['artist'] = Encoder.htmlDecode(eltTitleL_yt.getElement('input.yt_artist').get('value'));
	nextvidtitle['method_recommendation'] = 2;
	changeVideo(nextvidtitle);
}

// Charge une vidéo spécifique selon son id_title
var getVideoById = function(id){
	if (nextvidtitle['id_title']!=id){ // test nécessaire sinon bouclage avec le HistoryManager et l'évennement sur title:changed
		nextvidtitle = new Array();
		var req = new Request({
			method:'get',
			url:'index.php',
			data:'a=getVideoById&id_title='+id,
			onRequest:function(){
				 loader.makeAppear(true) // Affichage de la barre de chargement
			},
			onSuccess:function(responseText, responseXML){
				processRequest(responseXML);
			}
		});
		req.send();
	}
}

// Traite la réponse XML (de getVideoById(id) et nextVideo()) renvoyé par le serveur
var processRequest = function(responseXML){
	var xml = responseXML.documentElement;
	for(var i = 0; i < xml.childNodes.length; i++) { 
		var node = xml.childNodes[i];
		//console.log(node.nodeName); // Get nodeName value
		//console.log(node.firstChild.nodeValue); // Get node value }
		nextvidtitle[node.nodeName]=node.firstChild ? node.firstChild.nodeValue : "";
	}
	changeVideo(nextvidtitle);
	// Une fois l'ordre de changement de vidéo donnée, on cache la barre de chargement
	loader.makeDisappear();
}

// Change la vidéo
var changeVideo = function(nextvidtitle){
	//console.log(nextvidtitle);
	if (ytplayer!=null){
		try {
			ytplayer.loadVideoById(nextvidtitle['youtube_id']);
		} catch(e){
			console.log(e);
			console.log(nextvidtitle);
			//nextVideo();
		}
		// Changement des infos liées à la vidéo.
		loadTitleInfos();
	} else {
		loadytPlayer(nextvidtitle['youtube_id']);	
	}

	
}

// Effectue les changements liés au changement/chargement d'une vidéo
var loadTitleInfos = function(){
	// Mise à jour des titres
	var nomaff = nextvidtitle['artist'] != "" ? nextvidtitle['artist']+" - "+nextvidtitle['name'] : nextvidtitle['name'];
	$$('.tracktitle').set('text',nomaff);
	document.title = SITE_NAME+" | "+nextvidtitle['artist']+" - "+nextvidtitle['name'];
	// HM
	if (nextvidtitle['id_title'] !=-1)
		HM.set('title',nextvidtitle['id_title']);
	// Mise sous style si le morceau joué est présent dans la page
	isPlayingTitleLightening();
	// Infos artiste 
	refreshArtistInfo();
	// Mise à jour des bloc sur le coté
	$$('.sidebloc.updateOnNext').each(function(elt){
		updateSideBloc(elt);
	});
	// Mise à jour de l'interface recommandation
	if (isConnected() && (!errorOnVideo))
		recommandationUiRefresh(nextvidtitle);
	else {
		recommandationUiRefresh(false);
	}
}

// Initialisation des intéraction de l'interface recommandation
var recommandationUiInit = function(){
	isRateAverageEventActive = false;
	saveEval = false;
	// Ajout addEvent sur l'interface :
	$('recommandationui').addEvents({
		// Envoyé par le controleur lors de la connexion
		'connected':function(){
			activeSlider();
		},
		// Envoyé par le controleur lors de la déconexion
		'disconnected':function(){
			desactiveSlider();
		}
	});
	
	// Effet hover suivant
	var elt= $('nextarrow'); 
	var effet = new Fx.Tween(elt, {duration: 240, link:'cancel'});
	elt.addEvents({
		'mouseover': function(ev){
			effet.start('background-position','75px 0px');
		},
		'mouseout': function(){
			effet.start('background-position','65px 0px');
		}
	});
	
	// Slider recommandation :
	var slider = $('evalslider');
	knob = slider.getElement('.knob');
	evalSlider = new Slider(slider, knob,{
		range:[10,20],
		initialStep:15,
		//snap:true,
		//steps:10,
		onChange:function(value){
			if (value){
				 console.log(value-10);
				 var v = value-10;
				 // Changement opacité "j'aime" "j'aime pas"
				 var vop = v <=0 ? 0 : v/10;
				$('aimepas').set('opacity',1-vop);
				$('aime').set('opacity',vop);
			}
			// Recalage de la bar d'évaluation
			moveEvalBar();
			// On enlève le capteur d'évenement d'enregistrement de la note neutre (5/10) du knob
			if (isRateAverageEventActive){
				knob.removeEvent('click',rateAverage);
				isRateAverageEventActive = false;
				console.log("knob Average Event inactif");
			}
		},
		onComplete:function(value){
			if (value){
				 var v = value-10;
				 console.log(v);
				 // recalage du knob slider
				 this.set(value);
				 if (ytplayerState !=null && saveEval == true)
				 	updateRating(v);
			}
			// Recalage de la bar d'évaluation
			moveEvalBar();
		}
	});
	
	// Traitement du cas "Sans avis/Note neutre" : Note 5/10 lors d'un clic sur le knob (appelé dans recommandUiRefresh)
	rateAverage = function(){
		updateRating(5);
		evalSlider.set(15);
		knob.removeEvent('click',rateAverage);
		isRateAverageEventActive = false;
		console.log("knob Average Event inactif");
	}
	
	// Bar évaluation
	function moveEvalBar(){
		console.log('movebar');
		$('evalbar').setStyles({
			'left': knob.getStyle('left').toInt() > slider.getSize().x/2 ? slider.getSize().x/2+"px" : knob.getStyle('left').toInt()+"px",
			'width': knob.getStyle('left').toInt() > slider.getSize().x/2 ? knob.getStyle('left').toInt() - (slider.getSize().x/2) :  (slider.getSize().x/2) - knob.getStyle('left').toInt(),
			'background-color': knob.getStyle('left').toInt() > slider.getSize().x/2 ? '#7eb7bf' : '#bf7e7e'
		});			
	}
	// Test si connecté ou pas : A REVOIR ?
	if (! isConnected()){
		desactiveSlider();
	}
	// Active le slider
	function activeSlider(){
		recommandationUiRefresh(nextvidtitle);
		evalSlider.attach();
		saveEval=true;
		slider.removeEvent('mousedown',clicsliderdeco);
	}
	// Désactive le slider
	function desactiveSlider(){
		evalSlider.detach();
		saveEval=false;
		slider.addEvent('mousedown',clicsliderdeco = function(evt){
			evt.stop();
			lightbox($('unauthorizedaction'));	
		});
	}
	
	// Instanciation de la classe EvalMsg : Mise à jour du message d'évaluation
	evalMsg = new EvalMsg(); // utilisé dans la méthode loadTitleInfos() et updateRating()
	
	// Lecture auto ou pas :
	$('etatlect').set('text',(autoplay==true) ? "activée" : "désactivée"); 
	$('lectauto').addEvent('click',function(ev){
			ev.stop();
			if (autoplay == true){
				autoplay = false;
				$('etatlect').set('text','désactivée');
				Cookie.write('miushake_autoplay', 'false', {duration: 7});
			} else {
				autoplay = true;
				$('etatlect').set('text','activée');
				Cookie.write('miushake_autoplay', 'true', {duration: 7});
			}
			$('etatlect').tween('color',['#7EB7BF',$('etatlect').getStyle('color')]);
		}
	);
	
	// Container toujours visible ou pas :
	$('etatcontainer').set('text',(containerEvalVisible==true) ? "visible" : "cachée");
	$('containersetvisible').addEvent('click',function(ev){
			ev.stop();
			if (containerEvalVisible == true){
				containerEvalVisible = false;
				$('etatcontainer').set('text','cachée');
				Cookie.write('miushake_containerevalvisible', 'false', {duration: 7});
			} else {
				containerEvalVisible = true;
				$('etatcontainer').set('text','visible');
				Cookie.write('miushake_containerevalvisible', 'true', {duration: 7});
			}
			$('etatcontainer').tween('color',['#7EB7BF',$('etatcontainer').getStyle('color')]);
			
	});
	
}


// Mise à jour de l'interface recommandation
var recommandationUiRefresh = function(nextvid){
	if (nextvid){
		// Récup de l'objet Rating
		rating = new Array();
		var req = new Request({
			method:'post',
			url:'index.php?a=refreshRecommandUi',
			data:'id_title='+nextvid['id_title']+'&method_recommendation='+nextvid['method_recommendation'],
			onSuccess:function(responseText, responseXML){
				var xml = responseXML.documentElement;
				for(var i = 0; i < xml.childNodes.length; i++) { 
					var node = xml.childNodes[i];
					rating[node.nodeName]=node.firstChild.nodeValue;
				}
				// Changement du slider
				saveEval=false;
				if (rating['score']!= -1){
					rating['score'] = rating['score'].toInt()
					evalSlider.set(rating['score']+10);	
				} else {
					evalSlider.set(15);
					knob.addEvent('click',rateAverage);
					isRateAverageEventActive = true;
					console.log("knob Average Event actif");
				}
				saveEval=true;
				// Mise à jour du message d'évaluation
				evalMsg.refreshMsg();
			}		
		});
		req.send();
	} else {
		evalSlider.set(15);
		// Mise à jour du message d'évaluation
		evalMsg.refreshMsg();
	}
}

// Mise à jour du score ( maj 16/05/2011: youtube_id envoyé dans le cas d'une vidéo venant de YT pour procéder à l'enregistrement en BD du titre, et de la notation)
var updateRating = function (v){
	var dataPlus = rating['id_rating'] != -1 ? "" : '&youtube_id='+nextvidtitle['youtube_id']+'&artist='+escape(nextvidtitle['artist'])+'&name='+escape(nextvidtitle['name']);
	returnedIdTitle = null;
	returnedIdRating = null
	new Request({
		method:'post',
		url:'index.php?a=updateEval',
		evalScripts:true,
		data:'id_rating='+rating['id_rating']+'&score='+v+'&method_recommendation='+nextvidtitle['method_recommendation']+dataPlus,
		onSuccess:function(responseText, responseXML){
			// Mise à jour id_title et id_rating dans le cas d'un ajout d'un nouveau titre dans la bd (id_rating = -1)
			if (returnedIdTitle !=null){
				nextvidtitle['id_title'] = returnedIdTitle;
				HM.set('title',	nextvidtitle['id_title']);
			}
			if (returnedIdRating !=null)
				rating['id_rating'] = returnedIdRating;
				
			// Mise à jour du message d'évaluation
			rating['score']=v;
			evalMsg.setNewScore();
			
			// Mise à jour des bloc sur le coté
			$$('.sidebloc.updateOnEval').each(function(elt){
				updateSideBloc(elt);
			});
				
		}
	}).send();
}

// Si la page à changer // A CONTINUER
var getPage = function(page){
	console.log(page);
		
	// réinitialisation des catégories (ou sous pages)
	defaultcat = null;
	
	if (new Hash(HM.getHash().parseQueryString()).get('cat'))
		HM.remove('cat');
	
	// S'il s'agit pas de la page de recherche, on enlève le param cle s'il est présent
	if (page != "maRecherche" && new Hash(HM.getHash().parseQueryString()).get('cle'))
		HM.remove('cle');
	
	// vérif acces
	if (! accessVerification($(page))){
		//HM.remove('page');
		//history.go(-1);
		HM.set('page','accueil');
		return;
	}
	
	//$('content').set('html','<p>'+page+'</p>');
	
	// Cachée/Rendre visible l'interface d'évaluation si nécessaire
	if (!containerEvalVisible){
		if (page!="shakeIt"){
			if (slideContainerFx.open && ytplayer!=null)
				slideContainerFx.slideOut();
		}
		else {
			if (!slideContainerFx.open)
				slideContainerFx.slideIn();
		}
	}
	
	// Requete chargement de la page désirée
	new Request.HTML({
		method:'get',
		url:'index.php?a=getPage&page='+page,
		update:$('content'),
		onRequest:function(){
			loader.makeAppear(false);
			isPageLoading = true;
		},
		onSuccess: function(responseTree,responseElements,responseHTML,responseJavaScript){
			//console.log(responseHTML);
			loader.makeDisappear();
			isPageLoading = false;

			// Si une catégorie était en attente du chargement de la page
			if (waitingCatRoom != null){
				if(new Hash(HM.getHash().parseQueryString()).get('cat') == null)
					HM.set('cat',waitingCatRoom);
				else 
					HM.fireEvent('cat:changed',waitingCatRoom);
				waitingCatRoom = null;
			} else {
				// Si la variable defaultcat a changé, c'est qu'une catégorie par defaut de la page a été précisé depuis le controlleur ajax
				//console.log(new Hash(HM.getHash().parseQueryString()).get('cat'));
				if (defaultcat !=null){
					HM.set('cat',defaultcat);
				}
			}
			
			// capteurs de changement de catégories
			addEventNavCat();
			// capteurs d'évenements bloc p
			addEventBlocP();
			// Changement selecteur css (l'onglet courant possede la classe activepage)
			$$('.navpage').removeClass('activepage');
			$$('#'+page).addClass('activepage');
			
			// Mise à jour des blocs sur le coté
			$$('.sidebloc').each(function(elt){
				if (elt.getElement('.sideblocUpdateContainer')){
					if (elt.hasClass('needAuth')){
						if(isConnected()){
							elt.setStyle('display','block');
						} else {
							elt.setStyle('display','none');
						}
					}
					updateSideBloc(elt);
				}
			});
				
		}
	}).send();
}

// Get Sous catégorie d'une page
var getCat = function(cat){
	console.log(cat);
	//console.log(new Hash(HM.getHash().parseQueryString()).get('page'));
	var tparam="";
	if (nextvidtitle['id_title'])
		tparam = "&id_title="+nextvidtitle['id_title'];
	
		var update = $('principalcontent');
		new Request.HTML({
			method:'get',
			url:'index.php?a=getCat&cat='+cat+tparam,
			update:update,
			onRequest:function(){
				loader.makeAppear(false);
			},
			onSuccess: function(responseTree,responseElements,responseHTML,responseJavaScript){
				//console.log(responseHTML);
				loader.makeDisappear();
				// Changement selecteur css (l'onglet courant possede la classe activecat)
				$$('.navcat').removeClass('activecat');
				$$('#'+cat).addClass('activecat');
				waitingCatRoom = null;
				addEventBlocP();
				addEventTitle(update);
				isPlayingTitleLightening();	
			}
		}).send();
}

// Get Bloc de contenu paginées
var getBlocP = function(elt,s){

	if (! elt.search)
		elt.search = s ? s : "";
	
	var update = elt.getParent('.containerBlocP');
	var blocTarget = update.get('id');
	//console.log(elt.search);
	new Request.HTML({
		method:'get',
		url:'index.php'+elt.search,
		update:update,
		data:'blocTarget='+blocTarget,
		onRequest:function(){
			loader.makeAppear(false);
		},
		onSuccess: function(responseTree,responseElements,responseHTML,responseJavaScript){
				//console.log(responseHTML);
			loader.makeDisappear();
			addEventBlocP();
			addEventTitle(update);
			isPlayingTitleLightening();
		}
	}).send();
}

// Recherche
var initSearchBar = function(){
	var defautTxt = "Rechercher";
	mainSearchForm = $('menu').getElement('form');
	var mainSearchInput = mainSearchForm.getElement('input');
	mainSearchInput.value = defautTxt;
	
	mainSearchInput.addEvents({
		'select':function(ev){
			if (this.value == defautTxt)
				this.value = "";	
		},
		'mousedown':function(ev){
			if (this.value == defautTxt)
				this.value = "";
		}
	});
	
	mainSearchInput.addEvent('blur',function(ev){
		if (this.value == "")
			this.value = defautTxt;	
	});
	
	mainSearchForm.addEvent('submit',function(ev){
		ev.stop();
		
		var setHMCle = function(){
			if (new Hash(HM.getHash().parseQueryString()).get('cle') == null || new Hash(HM.getHash().parseQueryString()).get('cle') != encodeURIComponent(mainSearchForm.getElement('input').value))
				HM.set('cle',encodeURIComponent(mainSearchForm.getElement('input').value));
			else
				HM.fireEvent('cle:changed',encodeURIComponent(mainSearchForm.getElement('input').value));					
		}
		
		if (mainSearchForm.getElement('input').value !="" && mainSearchForm.getElement('input').value != defautTxt){
			if (new Hash(HM.getHash().parseQueryString()).get('page') != "maRecherche"){
				HM.set('page',"maRecherche");
				window.addEvent('maRecherchePageloaded', setHMCle);
			}
			else
				setHMCle();
		}
	});
	
	// AutoComplete
	new Autocompleter.Request.HTML(mainSearchInput, 'index.php?a=autoCompleteSearch', {
		'minLength' : 3,
		'maxChoices' : 14,
		'filterSubset' : true,
		'postVar': 'cle',
		//'indicatorClass': 'autocompleter-loading',
		'postData': {
			'title': '1', // send additional POST data, check the PHP code
			'user': '1',
			'autocomplete':'1',
		},
		'injectChoice': function(choice) {	// choice is one <li> element
			// the first element in this <li> is the <span> with a <div> containing the text
			var text = choice.getFirst().getFirst();

			var value = text.innerHTML;
			// inputValue saves value of the element for later selection
			choice.inputValue = value;
			// overrides the html with the marked query value (wrapped in a <span>)
			text.set('html', this.markQueryValue(value));
			// add the mouse events to the <li> element
			var el = this.addChoiceEvents(choice);
			//addEventTitle(el); <- 16/05/2011 Enlevé pour que l'autocompleter serve qu'a sa fonction première

		}
	});
	
}

// Ajoute des capteurs d'évenements sur les morceaux dans des listes pour une lecture manuelle
var addEventTitle = function(where){
	// where -> type ELement 
	//titleL -> musiques dans les listes
	if (where != null && document.getElement(where)){
		document.getElement(where).getElements('.titleL').removeEvent('click',playChosenTitle);
		document.getElement(where).getElements('.titleL').addEvent('click',playChosenTitle);
		document.getElement(where).getElements('.titleL_yt').removeEvent('click',playChosenYTTitle);
		document.getElement(where).getElements('.titleL_yt').addEvent('click',playChosenYTTitle);
	}
}

// Lit une musique choisi dans une liste
var playChosenTitle = function(ev){
	//if (ev)
		//ev.stop();
	console.log("play chosen title");

	var id_title = this.getElement('input.idTitle').get('value');
	getVideoById(id_title);	
}

// Lit une musique provenant de Youtube
var playChosenYTTitle = function(ev){
	console.log("YT id : "+this.getElement('input.yt_youtube_id').get('value'));
	getVideoFromYT(this);	
}


// Mise sous style si le morceau joué est présent dans la page
var isPlayingTitleLightening = function(){
	console.log('isPlayingTitleLightening');
	$$('.titleL').removeClass('isPlaying');
	$$('.titleL').each(function(el){
		if (el.getElement('input.idTitle').get('value') == nextvidtitle['id_title'])
			el.addClass('isPlaying');
	});
}

// page Shake It -> infos et actions concernant l'artiste/le groupe du morceau en cours
var refreshArtistInfo = function(){
	if (new Hash(HM.getHash().parseQueryString()).get('page') == "shakeIt"){
		if(new Hash(HM.getHash().parseQueryString()).get('cat') != "artisteinfos")
			HM.set('cat',"artisteinfos");
		HM.fireEvent('cat:changed',"artisteinfos");	
	}
}

// Mise à jours des blocs sur le coté
var updateSideBloc = function(sidebloc_elt){
	
	var id_bloc = $(sidebloc_elt) && sidebloc_elt.getElement('.sideblocUpdateContainer') ? sidebloc_elt.getElement('.sideblocUpdateContainer').get('id') : null;
	if (id_bloc == null)
		return;
	
	if ($(id_bloc).getParent('.sidebloc').hasClass('needAuth')){
		if(! isConnected())
			return;
	}
	
	if (!new Hash(HM.getHash().parseQueryString()).get('user'))
		if (!(nextvidtitle && nextvidtitle['id_title']))
			return;
		
	var id_userParam = "";	
	if (new Hash(HM.getHash().parseQueryString()).get('user'))
		id_userParam = "&id_user="+new Hash(HM.getHash().parseQueryString()).get('user');
	
	var update = $(id_bloc);
	var blocTarget = id_bloc;
	//console.log(elt.search);
	new Request.HTML({
		method:'get',
		url:'index.php?a=getSideBloc',
		update:update,
		data:'blocTarget='+blocTarget+'&id_title='+nextvidtitle['id_title']+id_userParam,
		onSuccess: function(responseTree,responseElements,responseHTML,responseJavaScript){
			addEventBlocP();
			addEventTitle(update);
			isPlayingTitleLightening();
			addEventInteracUser();
		}
	}).send();
}

/*
// Test si la page englobe correspond bien à la catégorie
var checkPageAccordingToCat = function(page){
	console.log("check "+page);
	if ( ! new Hash(HM.getHash().parseQueryString()).get('page') == page)
		HM.set('page',page);
}
*/